﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace RayTracer.Structures
{
    /// <summary>
    /// Modelliert einen OpenCL Int16
    /// </summary>
    [Serializable]
    [StructLayout(LayoutKind.Sequential)]
    public struct Int16
    {
        #region Attribute
        /// <summary>
        /// Gibt und setzt den Wert von s0.
        /// </summary>
        public int s0;

        /// <summary>
        /// Gibt und setzt den Wert von s1.
        /// </summary>
        public int s1;

        /// <summary>
        /// Gibt und setzt den Wert von s2.
        /// </summary>
        public int s2;

        /// <summary>
        /// Gibt und setzt den Wert von s3.
        /// </summary>
        public int s3;

        /// <summary>
        /// Gibt und setzt den Wert von s4.
        /// </summary>
        public int s4;

        /// <summary>
        /// Gibt und setzt den Wert von s5.
        /// </summary>
        public int s5;

        /// <summary>
        /// Gibt und setzt den Wert von s6.
        /// </summary>
        public int s6;

        /// <summary>
        /// Gibt und setzt den Wert von s7.
        /// </summary>
        public int s7;

        /// <summary>
        /// Gibt und setzt den Wert von s8.
        /// </summary>
        public int s8;

        /// <summary>
        /// Gibt und setzt den Wert von s9.
        /// </summary>
        public int s9;

        /// <summary>
        /// Gibt und setzt den Wert von sa.
        /// </summary>
        public int sa;

        /// <summary>
        /// Gibt und setzt den Wert von sb.
        /// </summary>
        public int sb;

        /// <summary>
        /// Gibt und setzt den Wert von sc.
        /// </summary>
        public int sc;

        /// <summary>
        /// Gibt und setzt den Wert von sd.
        /// </summary>
        public int sd;

        /// <summary>
        /// Gibt und setzt den Wert von se.
        /// </summary>
        public int se;

        /// <summary>
        /// Gibt und setzt den Wert von sf.
        /// </summary>
        public int sf;
        #endregion Attribute

        #region Methoden
        /// <summary>
        /// Initialisiert die Struktur mit Werten.
        /// </summary>
        /// <param name="s0">Der Wert für s0.</param>
        /// <param name="s1">Der Wert für s1.</param>
        /// <param name="s2">Der Wert für s2.</param>
        /// <param name="s3">Der Wert für s3.</param>
        /// <param name="s4">Der Wert für s4.</param>
        /// <param name="s5">Der Wert für s5.</param>
        /// <param name="s6">Der Wert für s6.</param>
        /// <param name="s7">Der Wert für s7.</param>
        /// <param name="s8">Der Wert für s8.</param>
        /// <param name="s9">Der Wert für s9.</param>
        /// <param name="sa">Der Wert für sa.</param>
        /// <param name="sb">Der Wert für sb.</param>
        /// <param name="sc">Der Wert für sc.</param>
        /// <param name="sd">Der Wert für sd.</param>
        /// <param name="se">Der Wert für se.</param>
        /// <param name="sf">Der Wert für sf.</param>
        public Int16(int s0, int s1, int s2, int s3, int s4, int s5, int s6, int s7,
                     int s8, int s9, int sa, int sb, int sc, int sd, int se, int sf)
        {
            this.s0 = s0;
            this.s1 = s1;
            this.s2 = s2;
            this.s3 = s3;
            this.s4 = s4;
            this.s5 = s5;
            this.s6 = s6;
            this.s7 = s7;
            this.s8 = s8;
            this.s9 = s9;
            this.sa = sa;
            this.sb = sb;
            this.sc = sc;
            this.sd = sd;
            this.se = se;
            this.sf = sf;
        }

        /// <summary>
        /// Gibt eine Zeichenkettenrepräsentation der Struktur zurück.
        /// </summary>
        /// <returns>Die Zeichenkette.</returns>
        public override string ToString()
        {
            return "s0: " + s0.ToString() +
                   " s1: " + s1.ToString() +
                   " s2: " + s2.ToString() +
                   " s3: " + s3.ToString() +
                   " s4: " + s4.ToString() +
                   " s5: " + s5.ToString() +
                   " s6: " + s6.ToString() +
                   " s7: " + s7.ToString() +
                   " s8: " + s8.ToString() +
                   " s9: " + s9.ToString() +
                   " sa: " + sa.ToString() +
                   " sb: " + sb.ToString() +
                   " sc: " + sc.ToString() +
                   " sd: " + sd.ToString() +
                   " se: " + se.ToString() +
                   " sf: " + sf.ToString();
        }
        #endregion Methoden
    }
}
